package com.clps.cn.Activite03;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.apache.commons.io.IOUtils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 从activite的act_ge_byteaway的资源，保存到相应的路径下
 * <p>
 * 用户想要查看找个请假流程的步骤
 * 第一种：
 * 使用activite的api来实现
 * 第二种
 * 使用jdbc对blob类型，clo类型的读取类型，并进行保存
 * 第三
 * io流中有common io流进行导入
 */
public class QueryBpmnFile {

    public static void main(String[] args) {

        //01：得到ProcessEngine的对象
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();

        //02：得到RepositoryService对象
        RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();

        //03:得到查询器：ProcessDefinaiition对象

        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
        //04：设置查询条件

        processDefinitionQuery.processDefinitionKey("holiday");
        //05：执行查询器，查询出想要的流程信息
        ProcessDefinition processDefinition = processDefinitionQuery.singleResult();

        //06:通过流程的定义信息，得到部署的id
        String deploymentId = processDefinition.getDeploymentId();

        //07:通过repositoryService的方法，实现读取图片信息，以及bpmn文件信息（主要是一个inputStream流信息）
        //getResourceAsStream（）方法第一个参数是部署id,第二个是代表资源的名称
        //getResourceAsStream代表获取bpmn的名称
        InputStream pngIs = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
        InputStream bmpnIs = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
        //08:构造出outPutStream流的信息
        try {
            FileOutputStream pngOs = new FileOutputStream("D:\\resource\\" + processDefinition.getDiagramResourceName());
            FileOutputStream bpmnOs = new FileOutputStream("D:\\resource\\" + processDefinition.getResourceName());
            //09:输入流和输出的转换，
            IOUtils.copy(pngIs, pngOs);
            IOUtils.copy(bmpnIs, bpmnOs);
            //关闭流的信息.
            pngIs.close();
            bmpnIs.close();
            pngOs.close();
            bpmnOs.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}
